////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Στο παρόν module υπάρχουν services σχετικά με τη συζήτηση.

Log.print('service module: sizitisi');

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Τα σχετικά με τις υπηρεσίες που ορίζονται στο παρόν module εντάσσονται στο
// singleton "sizitisi" το οποίο χρησιμοποιείται ως name space.

Service.sizitisi = {};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Service.sizitisi.moliviStart = function(req) {
	var trapezi;

	if (req.isvoli()) return;
	req.end();

	if (req.url.hasOwnProperty('trapezi')) trapezi = Skiniko.isTrapezi(req.url.trapezi);
	else trapezi = null;

	Skiniko.moliviAdd(req.sinedria.pektis, trapezi);
}

Service.sizitisi.moliviStop = function(req) {
	if (req.isvoli()) return;
	req.end();

	Skiniko.moliviDel(req.sinedria.pektis);
}

Service.sizitisi.sizitisiSxolio = function(req) {
	var trapezi, sxolio, kinisi;

	if (req.isvoli()) return;

	Skiniko.moliviDel(req.sinedria.pektis);

	if (!req.url.hasOwnProperty('kimeno')) {
		req.end('Δεν υπάρχει μήνυμα για δημοσίευση στη συζήτηση');
		return Skiniko.moliviDel(req.sinedria.pektis);
	}

	if (req.url.hasOwnProperty('trapezi')) {
		trapezi = Skiniko.isTrapezi(req.url.trapezi);
		if (!trapezi) {
			req.end('Το τραπέζι δεν υφίσταται πια');
			return Skiniko.moliviDel(req.sinedria.pektis);
		}
	}
	else trapezi = null;
	req.end();

	sxolio = new Sizitisi({
		'pektis': req.sinedria.pektis,
		'kimeno': req.url.kimeno,
	});

	kinisi = new Kinisi({
		'?': 'SZ',
		'p': req.sinedria.pektis,
		'k': req.url.kimeno,
	});
	if (trapezi) kinisi.kinisiSet({'t': trapezi.kodikos});

	sxolio.sizitisiAdd(trapezi);
	kinisi.kinisiAdd();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Καθορίζουμε κάποιο χρονικό όριο μετά το οποίο οι ενδείξεις
// γραφής θεωρούται παρωχημένες.

Service.sizitisi.moliviTimeout = 20;	// seconds

// Κρατάμε κάπου τη χρονική στιγμή του τελευταίου ελέγχου για
// λόγους οικονομίας.

Service.sizitisi.checkPrevts = 0;	// seconds

// Η function "check" είναι function περιπόλου και τρέχει σε τακτά διαστήματα
// της τάξης του λεπτού. Σκοπός είναι η εκκαθάριση των συζητήσεων τόσο όσον
// αφορά στο μέγεθος, όσο και στα μολύβια.

Service.sizitisi.check = function() {
	Service.sizitisi.check1(Skiniko.sizitisi);
	Skiniko.trapeziWalk(function(kodikos, trapezi) {
		if (!trapezi.hasOwnProperty('sizitisi')) return;
		Service.sizitisi.check1(trapezi.sizitisi);
	});
}

Service.sizitisi.check1 = function(sizitisi) {
	var tora, i;

	if (sizitisi.length > Prefadoros.maxSxolia) {
		sizitisi.splice(0, sizitisi.length - Prefadoros.maxSxolia);
	}

	tora = globals.toraServer();
	for (i = 0; i < sizitisi.length; i++) {
		if (!sizitisi[i].hasOwnProperty('pote')) continue;
		if (tora - sizitisi[i].pote < Service.sizitisi.moliviTimeout) continue;
		if (sizitisi[i].pote < Service.sizitisi.moliviCheckPrevts) continue;
		if ((sizitisi[i].kimeno != Prefadoros.sxolioKodikos.moliviTrapezi) &&
			(sizitisi[i].kimeno != Prefadoros.sxolioKodikos.moliviKafenio)) continue;
		sizitisi.splice(i, 1);
	}
	Service.sizitisi.moliviCheckPrevts = tora - Service.sizitisi.moliviTimeout;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Service.sizitisi.sizitisiDiagrafi = function(req) {
	var trapezi, kinisi, i;

	if (req.isvoli()) return;
	if (!req.trapezi) return req.end('Ακαθόριστο τραπέζι');
	req.end();

	kinisi = new Kinisi({
		'?': 'DZ',
		'p': req.sinedria.pektis,
		't': req.trapezi.kodikos,
	});

	if (req.url.hasOwnProperty('ola')) {
		req.trapezi.sizitisiDiagrafi(true);
		kinisi.kinisiSet({'a': 1});
	}
	else {
		req.trapezi.sizitisiDiagrafi();
	}

	kinisi.kinisiAdd();
}
